package com.elysia.visionmanagerspringboot.untils;

import com.aliyun.mts20140618.Client;
import com.aliyun.mts20140618.models.SubmitJobsRequest;
import com.aliyun.mts20140618.models.SubmitJobsResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import com.elysia.visionmanagerspringboot.enumeration.ResourceTypeEnum;
import com.elysia.visionmanagerspringboot.properties.AliyunMtsProperties;
import com.elysia.visionmanagerspringboot.properties.AliyunOssProperties;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 阿里云媒体处理服务(MTS)工具类，支持视频分辨率转换
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class AliyunMtsUtil {

    private final Client mtsClient;
    private final AliyunOssProperties aliyunOssProperties;
    private final AliyunMtsProperties aliyunMtsProperties;

    /**
     * 转换视频分辨率
     *
     * @param sourceOssKey      源视频在OSS中的路径
     * @param targetResolution  目标分辨率，必须是指定的可选值之一
     * @return 转码后的视频在OSS中的路径
     * @throws Exception 处理过程中发生的异常
     */
    public String convertVideoResolution(String sourceOssKey, String targetResolution) throws Exception {
        log.info("开始转换视频分辨率");
        log.info("支持的分辨率:{}", aliyunMtsProperties.getTemplate().keySet());
        // 验证输入参数
        validateParameters(sourceOssKey, targetResolution);

        // 获取转码模板ID
        String templateId = aliyunMtsProperties.getTemplate().get(targetResolution);
        if (templateId == null)
            throw new IllegalArgumentException("不支持的分辨率: " + targetResolution);

        // 构建输出文件路径
        String targetOssKey = buildTargetOssKey(sourceOssKey, targetResolution);

        // 创建转码任务请求
        SubmitJobsRequest request = createSubmitJobsRequest(sourceOssKey, targetOssKey, templateId, targetResolution);

        // 提交转码任务
        RuntimeOptions runtime = new RuntimeOptions();
        try {
            SubmitJobsResponse response = mtsClient.submitJobsWithOptions(request, runtime);
            log.info("视频转码任务提交成功: {}", response.getBody());
            log.info("源文件: {}，目标分辨率: {}，目标文件: {}",
                    sourceOssKey, targetResolution, targetOssKey);
            return targetOssKey;
        } catch (TeaException e) {
            log.error("阿里云MTS API调用异常: {}", e.getMessage());
            log.error("错误诊断地址: {}", e.getData().get("Recommend"));
            throw new Exception("视频转码任务提交失败: " + e.getMessage(), e);
        } catch (Exception e) {
            log.error("视频转码处理异常", e);
            throw new Exception("视频转码处理失败", e);
        }
    }

    /**
     * 验证输入参数的有效性
     */
    private void validateParameters(String sourceOssKey, String targetResolution) {
        if (sourceOssKey == null || sourceOssKey.isEmpty()) {
            throw new IllegalArgumentException("源视频路径不能为空");
        }

        if (targetResolution == null || targetResolution.isEmpty()) {
            throw new IllegalArgumentException("目标分辨率不能为空");
        }
    }

    /**
     * 构建目标文件在OSS中的存储路径
     */
    private String buildTargetOssKey(String sourceOssKey, String targetResolution) {
        // 1. 提取源文件扩展名
        String fileExtension = "";
        int lastDotIndex = sourceOssKey.lastIndexOf(".");
        if (lastDotIndex != -1) {
            fileExtension = sourceOssKey.substring(lastDotIndex);
        }

        // 2. 提取源文件名（不含路径和扩展名）
        String fileName = sourceOssKey.substring(
                sourceOssKey.lastIndexOf("/") + 1,
                lastDotIndex != -1 ? lastDotIndex : sourceOssKey.length()
        );

        // 3. 构建目标文件夹路径：video/{目标分辨率}/
        String folderPath = "video/" + targetResolution + "/";

        // 4. 拼接完整路径：video/{分辨率}/{源文件名}{扩展名}
        return folderPath + fileName + fileExtension;
    }

    /**
     * 创建提交转码任务的请求对象（移除 targetResourceType 相关逻辑）
     */
    private SubmitJobsRequest createSubmitJobsRequest(String sourceOssKey, String targetOssKey,
                                                      String templateId, String targetResolution) {
        // 1. 生成带 oss- 前缀的地域名（复用逻辑，避免重复代码）
        String ossRegion = "oss-" + aliyunOssProperties.getRegionId();

        // 2. 输入配置：Location 改用带 oss- 前缀的地域名
        String inputConfig = String.format(
                "{\"Bucket\":\"%s\",\"Location\":\"%s\",\"Object\":\"%s\"}",
                aliyunOssProperties.getBucketName(),
                ossRegion,  // 关键修正：Input 的 Location 加 oss- 前缀
                sourceOssKey
        );

        // 3. 输出配置：保持不变（已正确加前缀）
        String outputConfig = String.format(
                "[{\"OutputObject\":\"%s\",\"TemplateId\":\"%s\",\"UserData\":\"resolution=%s\"}]",
                targetOssKey,
                templateId,
                targetResolution
        );

        // 4. 构建请求：OutputLocation 也使用同一地域（确保输入输出地域一致）
        return new SubmitJobsRequest()
                .setInput(inputConfig)
                .setOutputs(outputConfig)
                .setOutputBucket(aliyunOssProperties.getBucketName())
                .setOutputLocation(ossRegion)  // 复用带前缀的地域名，避免不一致
                .setPipelineId(aliyunMtsProperties.getPipelineId());
    }
}
